﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Users
{
	/// <summary>
	/// 用户服务接口。
	/// </summary>
	public interface IUserService
	{
		/// <summary>
		/// 创建用户。
		/// </summary>
		/// <param name="username">用户名。</param>
		/// <param name="password">密码。</param>
		/// <param name="email">电子邮箱。</param>
		/// <returns>新创建的用户对应的User对象。</returns>
		/// <exception cref="UCExceiption"></exception>
		User CreateUser(string username, string password);

		/// <summary>
		/// 创建用户。
		/// </summary>
		/// <param name="email">电子邮箱。</param>
		/// <param name="password">密码。</param>
		/// <param name="nickname">昵称</param>
		/// <returns>新创建的用户对应的User对象。</returns>
		User CreateUserByEmail(string email, string password, string nickname);

		/// <summary>
		/// 创建用户。
		/// </summary>
		/// <param name="mobile">手机号码。</param>
		/// <param name="password">密码。</param>
		/// <param name="nickname">昵称</param>
		/// <returns>新创建的用户对应的User对象。</returns>
		User CreateUserByMobile(string mobile, string password, string nickname);

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="id">用户编号。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		User GetUser(int id);

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="username">用户名。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		User GetUser(string username);

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="email">电子邮箱。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		User GetUserByEmail(string email);

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="mobile">手机号码。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		User GetUserByMobile(string mobile);

		/// <summary>
		/// 获取用户集合。
		/// </summary>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		IList<User> GetUsers(Int32 pageIndex, Int32 pageSize);

		/// <summary>
		/// 获取用户数量。
		/// </summary>
		/// <returns>用户数量。</returns>
		Int32 GetCount();

		/// <summary>
		/// 获取用户集合，匹配用户名。
		/// </summary>
		/// <param name="username">要匹配的用户名。</param>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		IList<User> FindUsers(string username, Int32 pageIndex, Int32 pageSize);

		/// <summary>
		/// 获取用户集合，匹配电子邮箱。
		/// </summary>
		/// <param name="email">电子邮箱。</param>
		/// <param name="username">要匹配的用户名。</param>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		IList<User> FindUsersByEmail(string email, Int32 pageIndex, Int32 pageSize);

		/// <summary>
		/// 获取用户集合，匹配手机号码。
		/// </summary>
		/// <param name="mobile">手机号码。</param>
		/// <param name="username">要匹配的用户名。</param>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		IList<User> FindUsersByMobile(string mobile, Int32 pageIndex, Int32 pageSize);

		/// <summary>
		/// 验证密码
		/// </summary>
		/// <param name="password">明文密码</param>
		/// <param name="salt">错位码</param>
		/// <param name="encryptedPassword">加密后密码</param>
		/// <returns></returns>
		bool ValidatePassword(string password, string salt, string encryptedPassword);

		/// <summary>
		/// 验证密码是否正确
		/// </summary>
		/// <param name="id">用户编号</param>
		/// <param name="password">密码</param>
		/// <returns></returns>
		bool ValidateUser(int id, string password);

		/// <summary>
		/// 验证用户名和密码是否有效。
		/// </summary>
		/// <param name="username">用户名。</param>
		/// <param name="password">密码。</param>
		/// <returns>如果有效，返回true；否则返回false。</returns>
		bool ValidateUser(string username, string password);

		/// <summary>
		/// 验证电子邮箱和密码是否有效。
		/// </summary>
		/// <param name="email">电子邮箱</param>
		/// <param name="password">密码。</param>
		/// <returns>如果有效，返回true；否则返回false。</returns>
		/// <exception cref="UCExceiption">未开启电子邮箱登陆。</exception>
		bool ValidateUserByEmail(string email, string password);

		/// <summary>
		/// 验证手机号码和密码是否有效。
		/// </summary>
		/// <param name="email">手机号码。</param>
		/// <param name="password">密码。</param>
		/// <returns>如果有效，返回true；否则返回false。</returns>
		/// <exception cref="UCExceiption">为开启手机号码登陆。</exception>
		bool ValidateuserByMobile(string email, string password);

		/// <summary>
		/// 核对用户名合法性。
		/// </summary>
		/// <param name="username">被核对的用户名。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// </param>
		/// <returns>
		/// 如果用户名合法，则返回true；否则返回false。
		/// </returns>
		bool CheckUsername(string username, out ErrorCode errorCode);

		/// <summary>
		/// 核对昵称合法性。
		/// </summary>
		/// <param name="nickname">被核对的昵称。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// </param>
		/// <returns>如果用户名合法，则返回true；否则返回false。</returns>
		bool CheckNickname(string nickname, out ErrorCode errorCode);

		/// <summary>
		/// 核对昵称合法性。
		/// </summary>
		/// <param name="nickname">被核对的昵称。</param>
		/// <param name="exceptUserId">排除某个用户</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// </param>
		/// <returns>如果用户名合法，则返回true；否则返回false。</returns>
		bool CheckNickname(string nickname, int exceptUserId, out ErrorCode errorCode);

		/// <summary>
		/// 核对电子邮箱合法性。
		/// </summary>
		/// <param name="email">被核对的电子邮箱。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// </param>
		/// <returns>
		/// 如何电子邮箱合法，则返回true；否则返回false。
		/// </returns>
		bool CheckEmail(string email, out ErrorCode errorCode);

		/// <summary>
		/// 核对电子邮箱有效性
		/// </summary>
		/// <param name="email">被核对的电子邮箱</param>
		/// <param name="exceptUserId">排除某个用户</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// 可能的值为ErrorCodes.InvalidEmail或ErrorCodes.EmailAlreadyExists。
		/// </param>
		/// <returns>
		/// 如何电子邮箱合法，则返回true；否则返回false。
		/// </returns>
		bool CheckEmail(string email, int exceptUserId, out ErrorCode errorCode);

		/// <summary>
		/// 核对手机号码合法性。
		/// </summary>
		/// <param name="mobile">被核对的手机号码。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// </param>
		/// <returns>
		/// 如何电子手机号码，则返回true；否则返回false。
		/// </returns>
		bool CheckMobile(string mobile, out ErrorCode errorCode);

		/// <summary>
		/// 用户名是否存在。
		/// </summary>
		/// <param name="username">要检查的用户名。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		bool ExistsUsername(string username);

		/// <summary>
		/// 昵称是否存在。
		/// </summary>
		/// <param name="nickname">要检查的昵称。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		bool ExistsNickname(string nickname);

		/// <summary>
		/// 电子邮箱是否存在。
		/// </summary>
		/// <param name="email">要检查的电子邮箱。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		bool ExistsEmail(string email);

		/// <summary>
		/// 电子邮箱是否存在
		/// </summary>
		/// <param name="email">要检查的电子邮箱</param>
		/// <param name="exceptUserId">排除某个用户</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		bool ExistsEmail(string email, int exceptUserId);

		/// <summary>
		/// 手机号码是否存在。
		/// </summary>
		/// <param name="mobile">要检查的手机号码。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		bool ExistsMobile(string mobile);

		/// <summary>
		/// 修改用户头像。
		/// </summary>
		/// <param name="id">用户编号。</param>
		/// <param name="avatar">用户头像。</param>
		void UpdateAvatar(int id, string avatar);

		/// <summary>
		/// 更新电子邮箱，邮箱状态为未验证（0）
		/// </summary>
		/// <param name="id">用户编号</param>
		/// <param name="email">电子邮箱</param>
		void UpdateEmail(int id, string email);

		/// <summary>
		/// 更新电子邮箱和邮箱状态
		/// </summary>
		/// <param name="id">用户编号</param>
		/// <param name="email">电子邮箱</param>
		/// <param name="emailStatus">邮箱状态（0-未验证；1-已验证）</param>
		void UpdateEmail(int id, string email, int emailStatus);

		/// <summary>
		/// 修改密码
		/// </summary>
		/// <param name="id">用户编号</param>
		/// <param name="password">密码</param>
		void UpdatePassword(int id, string password);

		/// <summary>
		/// 修改昵称
		/// </summary>
		/// <param name="id">用户编号</param>
		/// <param name="nickname">昵称</param>
		void UpdateNickname(int id, string nickname);
	}
}
